/**
 * 封装一下主线程worker信息对象内容
 */
class MainThreadWorker{
    constructor(options){
        //实例化worker线程对象
        this.worker = new Worker(new URL(options?.workerUrl || "./WorkerThread.js", import.meta.url),{name:options?.workerName || "子任务处理",type:"module"});

        //定义i一个等待异步回调的集合对象，绑定的Promise的resolve方法
        this.actionHandlerMap = {};

        //调用二次封装的onmessage方法,并进行调用，改变this指向, 子线程向主线程发送消息的时候触发。
        this.worker.onmessage = this.onmessage.bind(this);
        this.markId = options.uid || 0;
    }
    //重写onmessage方法
    onmessage(e){
        //获取子线程返回过来的数据信息
        let {id,response} = e.data;

        //判断是哦福有等待异步回调的集合对象，如果没有直接返回
        if(!this.actionHandlerMap[id]) return;

        //调用集合上绑定的resolve方法
        this.actionHandlerMap[id].call(this,response);
        //执行完毕调用后删除当前绑定的id任务
        delete this.actionHandlerMap[id];
    }
    //重写postMessage方法
    postMessage(actions){
        //业务id的内容的信息
        const id = this.markId++;
        //封装一个Promise对象，并在调用对象的方法的执行执行resolve方法
        return new Promise((resolve,reject)=>{
            const message = {
                id,
                ...actions
            }
            //传送消息给worker子线程。
            this.worker.postMessage(message);

            //定义等待异步数据返回的方法
            this.actionHandlerMap[id] = (response)=>{
                resolve(response);//调用的时候可以直接用Promise，这样的话就可以直接用then
            }
        })
    }
}
//抛出整个class类的对象信息
export default MainThreadWorker;